#include"coin.h"
#include<iostream>
#include<vector>
#include<chrono>    // 用以计算效率
#include<fstream>
#include<sstream>
using namespace std;
using namespace std::chrono;

static int count = 0;   // 计数, 输入了几组数据

int main(){

    vector<int> coin = {1, 5, 10, 25};  // 硬币种类, 可修改
    int N = coin.size();    // 硬币种类数
    vector<pair<int, int>> coins(N);    // 第一个存储硬币金额, 第二个存储此硬币数量

    ifstream input("input.txt");    // 如果修改了硬币种类数, 还需要手动修改文件的输入
    ofstream output("output.txt");

    if(!input.is_open() || !output.is_open()){
        cout << "无法打开文件!" << endl;
        return 1;
    }

    string line;  
    vector<int> input_array(N + 1);  
 
    while(getline(input, line)){

        // 记录程序开始时间
        auto start = high_resolution_clock::now();  

        stringstream ss(line);
        for (int i = 0; i <= N; i++){  
            ss >> input_array[i];   // 读取文件每一行的数据(前4个为硬币个数,后一个为总金额)
            if(i != N){
                coins[i].first = coin[i];   // 读取硬币
                coins[i].second = input_array[i];   //读取硬币个数
            }
        }
        int amount = input_array[N];// 读取总金额
        int result = min_tot_num(coins, amount);    //求解
        output << "第" << ++count << "组:\n\t";
        output << "最小总硬币数: " << result << "\n\t";

        // 记录程序结束时间
        auto stop = high_resolution_clock::now();

        // 计算程序运行时间并输出结果
        auto duration = duration_cast<microseconds>(stop - start);
        output << "程序运行时间: " << duration.count() << "微秒" << endl;
    }

    input.close();
    output.close();
    cout << "数据已成功写入文件output.txt中.\n";

    // 可以取消以下注释(并注释上文main函数的部分), 修改数组coin并手动输入数据, 自己进行测试
/*
    vector<int> coin = {1, 5, 10, 25};  // 硬币种类, 可修改
    int N = coin.size();    // 硬币种类数
    vector<pair<int, int>> coins(N);    // 第一个存储硬币金额, 第二个存储此硬币数量

    for(int i = 0; i < N; i++){
        cout << "请输入" << coin[i] << "美分硬币的数量, 以回车结束输入: ";
        coins[i].first = coin[i];   // 存储硬币金额
        cin >> coins[i].second;     // 存储硬币数量
    }

    int amount; // 总金额
    cout << "请输入所需总金额, 以回车结束输入: ";
    cin >> amount;

    // 记录程序开始时间  
    auto start = high_resolution_clock::now();

    cout << "凑足" << amount << "的";
    cout << "最小总硬币数为: " << min_tot_num(coins, amount) << endl;


    // 记录程序结束时间  
    auto stop = high_resolution_clock::now();  
  
    // 计算程序运行时间并输出结果  
    auto duration = duration_cast<microseconds>(stop - start);  
    cout << "程序运行时间: " << duration.count() << " 微秒" << endl;
*/
    
    return 0;
}